package com.colabo.j2ee.web.core.util;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * date，time，datetime的工具类
 */
public class DateTimeUtil {
	/**
	 * 取得当前的Timestamp
	 * 
	 * @return 当前的Timestamp
	 */
	public static Timestamp nowTimestamp() {
		return getTimestamp(System.currentTimeMillis());
	}

	/**
	 * 根据毫秒时间值，获得对应的Timestamp
	 * 
	 * @time 时间的毫秒值
	 * 
	 * @return 当前的Timestamp
	 */
	public static Timestamp getTimestamp(long time) {
		return new Timestamp(time);
	}

	/**
	 * 取得当前的日期，表现为Date对象
	 * 
	 * @return 当前日期
	 */
	public static Date nowDate() {
		return new Date();
	}

	/**
	 * 抽取日期的年
	 * 
	 * @date 一个日期
	 * @return 日期的年
	 */
	public static int getYear(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal.get(Calendar.YEAR);
	}

	/**
	 * 格式化某个日期对象为字符串
	 * 
	 * @param date
	 *            一个日期
	 * @param pattern
	 *            日期格式化为字符串的模式，如yyyy-MM-dd
	 * @return 日期的字符串表示
	 */
	public static String formatDate(Date date, String pattern) {
		if (date == null) {
			return "";
		}

		if (pattern == null) {
			pattern = "yyyy-MM-dd";
		}

		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return (sdf.format(date));
	}

	/**
	 * 格式化某个日期为yyyy-MM-dd HH:mm:ss形式的字符串
	 * 
	 * @param date
	 *            一个日期
	 * @return 日期的字符串表示
	 */
	public static String formatDateTime(Date date) {
		return (formatDate(date, "yyyy-MM-dd HH:mm:ss"));
	}

	/**
	 * 得到当前时间，格式为yyyy-MM-dd HH:mm:ss形式的字符串
	 * 
	 * @return 当前时间，格式为yyyy-MM-dd HH:mm:ss形式的字符串
	 */
	public static String getCurrentDateTime() {
		return (formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
	}

	/**
	 * 格式化当前时间为yyyy-MM-dd HH:mm:ss形式的字符串
	 * 
	 * @return 当前时间yyyy-MM-dd HH:mm:ss形式的表示
	 */
	public static String formatDateTime() {
		return (formatDate(now(), "yyyy-MM-dd HH:mm:ss"));
	}

	/**
	 * 格式化某个日期为yyyy-MM-dd形式的字符串
	 * 
	 * @param date
	 *            一个日期
	 * @return 日期为yyyy-MM-dd形式的表示
	 */
	public static String formatDate(Date date) {
		return (formatDate(date, "yyyy-MM-dd"));
	}

	/**
	 * 格式化当前日期为yyyy-MM-dd形式的字符串
	 * 
	 * @param date
	 *            一个日期
	 * @return 当前日期为yyyy-MM-dd形式的表示
	 */
	public static String formatDate() {
		return (formatDate(now(), "yyyy-MM-dd"));
	}

	/**
	 * 格式化某个Date对象为HH:mm:ss形式的字符串
	 * 
	 * @param date
	 *            一个日期
	 * @return Date对象HH:mm:ss形式的表示
	 */
	public static String formatTime(Date date) {
		return (formatDate(date, "HH:mm:ss"));
	}

	/**
	 * 格式化当前时间为HH:mm:ss形式的字符串
	 */
	public static String formatTime() {
		return (formatDate(now(), "HH:mm:ss"));
	}

	/**
	 * 格式化当前时间为HHmmss形式的string
	 */
	public static String formatTime2() {
		return (formatDate(now(), "HHmmss"));
	}

	/**
	 * 获得当前日期对象
	 */
	private static Date now() {
		return (new Date());
	}

	/**
	 * 将字符串形式的时间转为Date对象
	 * 
	 * @datetiem 一个字符串形式的时间
	 * 
	 * @return 字符串形式的时间对应的Date对象
	 */
	public static Date parseDateTime(String datetime) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		if ((datetime == null) || (datetime.equals(""))) {
			return null;
		} else {
			try {
				return formatter.parse(datetime);
			} catch (ParseException e) {
				return parseDate(datetime);
			}
		}
	}

	/**
	 * 将字串形式的日期转为Date对象
	 * 
	 * @datetiem 一个字符串形式的日期
	 * 
	 * @return 字串形式的日期对应的Date对象
	 */
	public static Date parseDate(String date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

		if ((date == null) || (date.equals(""))) {
			return null;
		} else {
			try {
				return formatter.parse(date);
			} catch (ParseException e) {
				return null;
			}
		}
	}

	/**
	 * 将DateTime对象的时间转为Date对象
	 * 
	 * @param 带时间的日期对象
	 * 
	 * @return 不带时间的日期对象
	 */
	public static Date parseDate(Date datetime) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

		if (datetime == null) {
			return null;
		} else {
			try {
				return formatter.parse(formatter.format(datetime));
			} catch (ParseException e) {
				return null;
			}
		}
	}

	/**
	 * 将yyyymmdd形式的时间string转为Date对象
	 */
	public static Date parseDateYYMMDD(String date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");

		if ((date == null) || (date.equals(""))) {
			return null;
		} else {
			try {
				return formatter.parse(date);
			} catch (ParseException e) {
				return null;
			}
		}
	}

	/**
	 * 将一个对象转为日期格式(不带时间)表示的对象
	 */
	public static String formatDate(Object o) {
		if (o == null) {
			return "";
		}
		if (o.getClass() == String.class) {
			return formatDate((String) o);
		} else if (o.getClass() == Date.class) {
			return formatDate((Date) o);
		} else if (o.getClass() == Timestamp.class) {
			return formatDate(new Date(((Timestamp) o).getTime()));
		} else {
			return o.toString();
		}
	}

	/**
	 * 将一个对象转为日期格式(带时间)表示的对象
	 */
	public static String formatDateTime(Object o) {
		if (o.getClass() == String.class) {
			return formatDateTime((String) o);
		} else if (o.getClass() == Date.class) {
			return formatDateTime((Date) o);
		} else if (o.getClass() == Timestamp.class) {
			return formatDateTime(new Date(((Timestamp) o).getTime()));
		} else {
			return o.toString();
		}
	}

	/**
	 * 给时间加上或减去指定毫秒，秒，分，时，天、月或年等，返回变动后的时间
	 * 
	 * @param date
	 *            要加减前的时间，如果不传，则为当前日期
	 * @param field
	 *            时间域，有Calendar.MILLISECOND,Calendar.SECOND,Calendar.MINUTE,<br>
	 *            Calendar.HOUR,Calendar.DATE, Calendar.MONTH,Calendar.YEAR
	 * @param amount
	 *            按指定时间域加减的时间数量，正数为加，负数为减。
	 * @return 变动后的时间
	 */
	public static Date add(Date date, int field, int amount) {
		if (date == null) {
			date = new Date();
		}

		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(field, amount);

		return cal.getTime();
	}

	/**
	 * 获得当前日期上增加若干毫秒后的日期
	 */
	public static Date addMilliSecond(Date date, int amount) {
		return add(date, Calendar.MILLISECOND, amount);
	}

	/**
	 * 获得当前日期上增加若干秒后的日期
	 */
	public static Date addSecond(Date date, int amount) {
		return add(date, Calendar.SECOND, amount);
	}

	/**
	 * 获得当前日期上增加若干分后的日期
	 */
	public static Date addMiunte(Date date, int amount) {
		return add(date, Calendar.MINUTE, amount);
	}

	/**
	 * 获得当前日期上增加若干小时后的日期
	 */
	public static Date addHour(Date date, int amount) {
		return add(date, Calendar.HOUR, amount);
	}

	/**
	 * 获得当前日期上增加若干小时后的日期
	 */
	public static Date addDay(Date date, int amount) {
		return add(date, Calendar.DATE, amount);
	}

	/**
	 * 获得当前日期上增加若干月后的日期
	 */
	public static Date addMonth(Date date, int amount) {
		return add(date, Calendar.MONTH, amount);
	}

	/**
	 * 获得当前日期上增加若干年后的日期
	 */
	public static Date addYear(Date date, int amount) {
		return add(date, Calendar.YEAR, amount);
	}

	/**
	 * 获得不带时间的Date对象
	 */
	public static Date getDate() {
		return parseDate(formatDate());
	}

	/**
	 * 获得带时间的Date对象
	 */
	public static Date getDateTime() {
		return parseDateTime(formatDateTime());
	}

	/**
	 * 将日期的字符串格式专为Date对象
	 * 
	 * @param date
	 *            日期的字符串
	 * @param flag
	 *            true:格式为yyyyMMdd；false:yyyy-MM-dd
	 * @return Date对象
	 */
	public static Date parseDate(String date, boolean flag) {
		if (flag) {
			SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");

			if ((date == null) || (date.equals(""))) {
				return null;
			} else {
				try {
					Date a = formatter.parse(date);
					return a;
				} catch (ParseException e) {
					return null;
				}
			}
		} else {
			return parseDate(date);
		}
	}

	/**
	 * 时间毫秒转为Date
	 */
	public static Date getDate(long ms) {
		Date aDate = new Date();
		aDate.setTime(ms);
		return aDate;
	}
}
